package utils

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"time"

	"gitee.com/jiangjiali/z-tcp/ziface"
)

/*
	GlobalObj 存储一切有关框架的全局参数，供其他模块使用
	一些参数也可以通过 用户根据 config.json 来配置
*/
type GlobalObj struct {
	/*
		Server
	*/
	TcpServer ziface.IServer //当前的全局Server对象
	Host      string         `json:"host"` //当前服务器主机IP
	Port      int            `json:"port"` //当前服务器主机监听端口号
	Name      string         `json:"name"` //当前服务器名称

	Version          string        `json:"version"`             //当前版本号
	MaxPacketSize    uint32        `json:"max-packet-size"`     //都需数据包的最大值
	MaxConn          int           `json:"max-conn"`            //当前服务器主机允许的最大链接个数
	WorkerPoolSize   int64         `json:"worker-pool-size"`    //业务工作Worker池的数量
	MaxWorkerTaskLen uint32        `json:"max-worker-task-len"` //业务工作Worker对应负责的任务队列最大任务存储数量
	MaxMsgChanLen    uint32        `json:"max-msg-chan-len"`    //SendBuffMsg发送消息的缓冲最大长度
	PairTime         time.Duration `json:"pair-time"`           //首次通信时长 默认60s

	HeartbeatInterval int `json:"heartbeat-interval"` // 心跳间隔时间检查

	/*
		连接限流设置
	*/
	Limiter int `json:"limiter"` //每秒连接数限制
}

/*
	GlobalObject 定义一个全局的对象
*/
var GlobalObject *GlobalObj

// PathExists 判断一个文件是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// Reload 读取用户的配置文件
func (g *GlobalObj) Reload() {
	confFilePath := "./config.json"

	if confFileExists, _ := PathExists(confFilePath); confFileExists != true {
		//fmt.Println("Config File ", g.ConfFilePath , " is not exist!!")
		return
	}

	data, err := ioutil.ReadFile(confFilePath)
	if err != nil {
		fmt.Println("[加载配置] 读取文件错误:", err)
	}
	//将json数据解析到struct中
	err = json.Unmarshal(data, g)
	if err != nil {
		fmt.Println("[加载配置] json解析错误:", err)
	}
}

/*
	提供init方法，默认加载
*/
func init() {
	//初始化GlobalObject变量，设置一些默认值
	GlobalObject = &GlobalObj{
		Name:             "server",
		Version:          "1.0.0",
		Port:             8999,
		Host:             "0.0.0.0",
		MaxConn:          5000,
		MaxPacketSize:    32768,
		WorkerPoolSize:   2,
		MaxWorkerTaskLen: 4096,
		MaxMsgChanLen:    4096,
		PairTime:         60,
		Limiter:          10,
		HeartbeatInterval: 60,
	}

	//从配置文件中加载一些用户配置的参数
	GlobalObject.Reload()
}
